package com.isak.likou.likoudemo;

public class GenerateMatrix {

    /**
     * 螺旋矩阵 II
     * 给你一个正整数 n ，生成一个包含 1 到 n*n 所有元素，且元素按顺时针顺序螺旋排列的 n * n 正方形矩阵 matrix 。
     * 示例:
     * 输入：n = 3
     * 输出：[[1,2,3],[8,9,4],[7,6,5]]  等价于  [1,2,3]
     *                                       [8,9,4]
     *                                       [7,6,5]
     *
     * @param n
     * @return
     */
    public static int[][] generateMatrix(int n) {
        int[][] a = new int[n][n];
        if(n == 1){
            a[0][0] = 1;
            return a;
        }
        int count = n / 2;  // 需要循环的次数，→ ↓ ← ↑ 为一次循环
        int remainder = n % 2; // 余数，比如当n为3时，直接循环一次，并为正中央的位置设置值即可
        for (int i = 0; i < count; i++) {
            setValues(a, i == 0 ? 0 : a[i][i - 1], i); // 这里第二个参数使用了三目运算符，如果是首次循环，则传0，否则传上一次循环最后一个位置的值，方便继续递增
        }
        if (remainder == 1) { // 如果是奇数，则为正中央位置设置值
            a[count][count] = a[count][count - 1] +1;
        }
        return a;
    }

    /**
     * 按 → ↓ ← ↑ 顺序为数组赋值
     * @param a
     * @param start
     * @param d
     */
    public static void setValues(int[][] a, int start, int d) {
        int row = d; // 行
        for (int i = 0 + d; i < a.length - d; i++) { // 往→赋值
            a[row][i] = ++start;
        }
        int column = a.length - 1 - d; // 列
        for (int j = 1 + d; j < a.length - d; j++) { // 继上一步骤后，往↓赋值
            a[j][column] = ++start;
        }
        row = a.length - 1 - d;
        for (int k = a.length - 2 - d; k > -1 + d; k--) { // 继上一步骤后，往←赋值
            a[row][k] = ++start;
        }
        column = d;
        for (int l = a.length - 2 - d; l > d; l--) { // 继上一步骤后，往↑赋值
            a[l][column] = ++start;
        }
    }

}

